package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.util.CookieUtil;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/user")
public class UserController {

    //定义cookie的名称，因为cookie名称是我们自己定义的，所以知道
    private static final String Ticket = "JT_TICKET";

    //如果不配置算法，那么默认采用随机算法
    @Reference(check = false)   //check表示消费者在启动时检测是否有服务的提供者
    private DubboUserService dubboUserService;

    @Autowired
    private JedisCluster jedisCluster;

    /**
     *   一个方法实现页面的通用跳转
     */
    @RequestMapping("/{model}")
    public String moduleName(@PathVariable String model){
        return model;
    }

    /**
     * 请求地址：http://www.jt.com/user/doRegister
     * 返回值对象：SysResult对象
     * 用户注册  入库
     */
    @RequestMapping("/doRegister")
    @ResponseBody
    public SysResult doRegister(User user){
        dubboUserService.insertUser(user);
        return SysResult.success();
    }

    /**
     * 1.url地址:http://www.jt.com/user/doLogin?r=0.04360522021726099
     * 2.参数:  {username:_username,password:_password},
     * 3.返回值结果:  SysResult
     *
     * 需求1:  将cookie名称为 "JT_TICKET"数据输出到浏览器中,要求7天超时.
     * 并且实现"jt.com"数据共享
     *
     * Cookie特点:
     *  1.浏览器中只能查看当前网址下的Cookie信息
     *  2.doMain 表示cookie共享的策略
     *    doMain:www.jd.com   当前的Cookie数据只能在当前域名中使用
     *    doMain:.jd.com      当前Cookie是共享的可以在域名为jd.com结尾的域名中共享.
     */
    @RequestMapping("/doLogin")
    @ResponseBody
    public SysResult doLogin(User user, HttpServletResponse response){
        //完成用户登录操作之后获取ticket秘钥信息
        String ticket = dubboUserService.doLogin(user);
        if (StringUtils.isEmpty(ticket)){
            return SysResult.fail();
        }
        //1.创建Cookie对象
        Cookie cookie = new Cookie(Ticket,ticket);
        /**
         * 2.设定cookie存活的时间
         * value=-1   当用户关闭回话时，cookie删除
         * value=-1   立即删除cookie
         * value>0    设定cookie超时时间
         */
        cookie.setMaxAge(60*60*24*7);
        //3.在jt.com的域名中实现数据共享
        cookie.setDomain("jt.com");
        cookie.setPath("/");
        response.addCookie(cookie);     //向浏览器发送cookie
        //使用自己写的工具API
        //CookieUtil.addCookie(Ticket,ticket,"/","jt.com",7*24*60*60,response);
        return SysResult.success();
    }


    /**
     * 实现用户退出操作
     * url:http://www.jt.com/user/logout.html
     * 返回值: 重定向到系统首页.
     * 目的:  删除redis. 删除Cookie
     * 前提:  需要获取cookie的key和value
     */
    @RequestMapping("/logout")
    public String logout(HttpServletResponse response, HttpServletRequest request){
        Cookie cookie = CookieUtil.getCookieName(Ticket, request);
        //1.校验cookie中是否有记录
        if (cookie != null){
            String jtTicket = cookie.getValue();
            if (!StringUtils.isEmpty(jtTicket)){
                //如果cookie有值，则删除redis缓存
                jedisCluster.del(jtTicket);
                //2.删除cookie
                CookieUtil.deleteCookie(Ticket,"/","jt.com",response);
            }
        }
        return "redirect:/";
    }
}
